package nowcoder.datastruct1;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 描述
 * 哈希表常见的三个操作时put、get和containsKey，而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能，就是把所有记录value都设成统一的值。请设计并实现这种有setAll功能的哈希表，并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。
 * [友情提示]: C++选手若有需要可以使用unordered_map替换map来将复杂度从O(log n)降为O(1)
 * 输入描述：
 * 第一行一个整数N表示操作数。
 * 接下来N行，每行第一个数字opt代表操作类型
 * 若opt=1，接下来有两个整数x, y表示设置key=x对应的value=y
 * 若opt=2，接下来一个整数x，表示查询key=x对应的value，若key=x不存在输出-1
 * 若opt=3，接下来一个整数x，表示把加入过的所有的key对应的value都设置为x
 * 输出描述：
 * 对于每个操作2，输出一个整数表示答案
 * 示例1
 * 输入：
 * 6
 * 1 1 2
 * 2 1
 * 2 2
 * 3 4
 * 2 1
 * 2 2
 * 复制
 * 输出：
 * 2
 * -1
 * 4
 * -1
 *
 */
public class SetAll {

    private final Map<Integer, int[]> m = new HashMap<>();
    private Integer currentVersion = 0;
    private Integer currentVersionValue = 0;

    public void put(int k, int v) {
        m.put(k, new int[]{v, currentVersion});
    }

    public int get(int k) {
        if (!containsKey(k)) {
            return -1;
        }
        int[] v = m.get(k);
        if (v[1] >= currentVersion) {
            return v[0];
        }
        return currentVersionValue;
    }

    public boolean containsKey(int k) {
        return m.containsKey(k);
    }

    public void setAll(int v) {
        currentVersion++;
        currentVersionValue = v;
    }

    public static void main(String[] args) {
        SetAll sa = new SetAll();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.println("n = " + n);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int b = in.nextInt();
            if (a == 1) {
                int c = in.nextInt();
                sa.put(b, c);
            }else if(a == 2) {
                System.out.println(sa.get(b));
            }else if(a == 3) {
                sa.setAll(b);
            }
            // System.out.println(Arrays.asList(a, b, c));
        }
    }
}
